from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
from django.utils import timezone
from datetime import datetime, timedelta
from cinema.models import Movie, CinemaHall, Seat, Screening, UserProfile

class Command(BaseCommand):
    help = '初始化电影院系统的基础数据'

    def handle(self, *args, **options):
        self.stdout.write('开始初始化数据...')
        
        # 创建影厅
        halls = []
        hall_data = [
            {'name': '1号厅', 'capacity': 120, 'hall_type': '2D'},
            {'name': '2号厅', 'capacity': 80, 'hall_type': '3D'},
            {'name': '3号厅', 'capacity': 60, 'hall_type': 'IMAX'},
            {'name': 'VIP厅', 'capacity': 40, 'hall_type': 'VIP'},
        ]
        
        for hall_info in hall_data:
            hall, created = CinemaHall.objects.get_or_create(
                name=hall_info['name'],
                defaults=hall_info
            )
            halls.append(hall)
            if created:
                self.stdout.write(f'创建影厅: {hall.name}')
        
        # 为每个影厅创建座位
        for hall in halls:
            self.create_seats_for_hall(hall)
        
        # 创建电影
        movies = []
        movie_data = [
            {
                'title': '复仇者联盟4：终局之战',
                'director': '安东尼·罗素',
                'actors': '小罗伯特·唐尼,克里斯·埃文斯,马克·鲁法洛',
                'genre': '动作/科幻',
                'duration': 181,
                'description': '在《复仇者联盟3：无限战争》的毁灭性事件过后，宇宙由于灭霸的行动而变得满目疮痍。无论前方将遭遇怎样的后果，复仇者联盟都必须在剩余盟友的帮助下再一次集结，以逆转灭霸的所作所为，彻底恢复宇宙的秩序。',
                'price': 45.00,
                'rating': 8.5,
                'release_date': timezone.now().date() - timedelta(days=30),
                'poster': 'poster/复仇者联盟4.webp',
            },
            {
                'title': '泰坦尼克号',
                'director': '詹姆斯·卡梅隆',
                'actors': '莱昂纳多·迪卡普里奥,凯特·温斯莱特',
                'genre': '爱情/灾难',
                'duration': 194,
                'description': '1912年4月15日，载着1316号乘客和891名船员的豪华巨轮"泰坦尼克号"与冰山相撞而沉没，这场海难被认为是20世纪人间十大灾难之一。',
                'price': 35.00,
                'rating': 9.4,
                'release_date': timezone.now().date() - timedelta(days=15),
                'poster': 'poster/泰坦尼克号.webp',
            },
            {
                'title': '阿凡达',
                'director': '詹姆斯·卡梅隆',
                'actors': '萨姆·沃辛顿,佐伊·索尔达娜',
                'genre': '科幻/冒险',
                'duration': 162,
                'description': '战斗中负伤而下身瘫痪的前海军战士杰克·萨利决定替死去的同胞哥哥来到潘多拉星操纵格蕾丝博士用人类基因与当地纳美部族基因结合创造出的"阿凡达"混血生物。',
                'price': 50.00,
                'rating': 8.7,
                'release_date': timezone.now().date() + timedelta(days=7),
                'poster': 'poster/阿凡达.webp',
            },
            {
                'title': '星际穿越',
                'director': '克里斯托弗·诺兰',
                'actors': '马修·麦康纳,安妮·海瑟薇',
                'genre': '科幻/冒险',
                'duration': 169,
                'description': '一组探险家利用最近发现的虫洞进行星际旅行。这个虫洞应该允许人类穿越广袤的宇宙距离。',
                'price': 40.00,
                'rating': 8.6,
                'release_date': timezone.now().date() + timedelta(days=14),
                'poster': 'poster/星际穿越.webp',
            },
            {
                'title': '盗梦空间',
                'director': '克里斯托弗·诺兰',
                'actors': '莱昂纳多·迪卡普里奥,约瑟夫·高登-莱维特',
                'genre': '科幻/动作',
                'duration': 148,
                'description': '道姆·柯布是一位经验丰富的盗梦者，在这项危险的行当里，他是最好的，代价就是成为国际逃犯，最爱的两个孩子也离他远去。',
                'price': 38.00,
                'rating': 8.8,
                'release_date': timezone.now().date() - timedelta(days=5),
                'poster': 'poster/盗梦空间.webp',
            },
        ]
        
        for movie_info in movie_data:
            movie, created = Movie.objects.get_or_create(
                title=movie_info['title'],
                defaults=movie_info
            )
            # 如果电影已存在但没有海报，更新海报
            if not created and not movie.poster:
                movie.poster = movie_info['poster']
                movie.save()
                self.stdout.write(f'更新电影海报: {movie.title}')
            elif created:
                self.stdout.write(f'创建电影: {movie.title}')
            
            movies.append(movie)
        
        # 创建场次
        self.create_screenings(movies, halls)
        
        # 创建测试用户
        self.create_test_users()
        
        self.stdout.write(self.style.SUCCESS('数据初始化完成！'))
        self.stdout.write('管理员账号: admin (密码: admin123)')
        self.stdout.write('测试用户账号: testuser (密码: test123)')

    def create_seats_for_hall(self, hall):
        """为影厅创建座位"""
        rows = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']
        cols = list(range(1, 21))  # 1-20列
        
        seats_created = 0
        for row in rows:
            for col in cols:
                seat_number = f"{row}{col:02d}"
                seat, created = Seat.objects.get_or_create(
                    hall=hall,
                    row=row,
                    column=col,
                    defaults={'seat_number': seat_number}
                )
                if created:
                    seats_created += 1
        
        if seats_created > 0:
            self.stdout.write(f'为{hall.name}创建了{seats_created}个座位')

    def create_screenings(self, movies, halls):
        """创建场次"""
        screening_created = 0
        base_time = timezone.now().replace(hour=10, minute=0, second=0, microsecond=0)
        
        for movie in movies:
            if movie.release_date <= timezone.now().date():
                # 为已上映的电影创建场次
                for i, hall in enumerate(halls):
                    start_time = base_time + timedelta(days=i, hours=i*3)
                    end_time = start_time + timedelta(minutes=movie.duration)
                    
                    screening, created = Screening.objects.get_or_create(
                        movie=movie,
                        hall=hall,
                        start_time=start_time,
                        defaults={
                            'end_time': end_time,
                            'price': movie.price + (i * 5),  # 不同影厅价格不同
                        }
                    )
                    if created:
                        screening_created += 1
        
        if screening_created > 0:
            self.stdout.write(f'创建了{screening_created}个场次')

    def create_test_users(self):
        """创建测试用户"""
        # 创建测试用户
        test_user, created = User.objects.get_or_create(
            username='testuser',
            defaults={
                'email': 'test@example.com',
                'first_name': '测试',
                'last_name': '用户',
            }
        )
        
        if created:
            test_user.set_password('test123')
            test_user.save()
            
            # 创建用户资料
            UserProfile.objects.get_or_create(
                user=test_user,
                defaults={
                    'phone': '13800138000',
                    'points': 100,
                }
            )
            
            self.stdout.write('创建测试用户: testuser')
        
        # 设置管理员密码
        admin_user = User.objects.get(username='admin')
        admin_user.set_password('admin123')
        admin_user.save()
        self.stdout.write('设置管理员密码: admin123') 